# coding=utf-8
"""
登录拦截器
"""

from application import app
from flask import request, redirect, g
from common.models.User import User
from common.libs.user.UserLibs import UserLibs
from common.libs.log.LogLibs import LogLibs
from common.libs.UrlManager import UrlManager
import re

@app.before_request
def before_request():
    """
    每一次请求之前，经过拦截器
    :return:
    """

    #忽略名单
    ignore_urls = app.config["IGNORE_URLS"]
    ignore_check_login_urls = app.config["IGNORE_CHECK_LOGIN_URLS"]

    #首先获取请求的url，然后判断是否可以忽略拦截
    path = request.path
    pattern = re.compile("%s" % "|".join(ignore_check_login_urls))
    if pattern.match(path) :
        return

    #检测是否登录
    user_info = check_login()
    g.current_user = None
    if user_info :
        g.current_user = user_info

    #记录每一条http请求的操作者，写入日志表
    LogLibs.addAccessLog()

    #判断是否为登录页面，如果为登录页面也忽略拦截，防止死循环
    pattern = re.compile("%s" % "|".join(ignore_urls))
    if pattern.match(path) :
        return

    #跳转到登录页面
    if not user_info :
        return redirect( UrlManager.buildUrl("/user/login") )

def check_login():
    """
    判断是否登录
    :return:
    """
    cookies = request.cookies

    #判断cookie是否存在
    auth_cookie = cookies[ app.config["AUTH_COOKIE_NAME"] ] if app.config["AUTH_COOKIE_NAME"] in cookies else None
    if auth_cookie is None:
        return False

    #判断cookie值格式是否正确
    auth_info = auth_cookie.split("#")
    if len(auth_info) != 2 :
        return False

    #检测用户是否存在
    try :
        user_info = User.query.filter_by(uid = auth_info[1]).first()
    except Exception :
        return False

    if user_info is None:
        return False

    #判断cookie值内容是否正确
    if auth_info[0] != UserLibs.geneAuthCode(user_info) :
        return False

    if user_info.status != 1 :
        return False

    #一切OK，返回用户信息
    return user_info
